using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using NEX_Datos;
using System.Text;
using NEXServicio;

namespace NEXServicio
{
    public class ServicioAutor : ServicioPadre
    {
        #region Contantes

        public const String DataTableName = "Autor";

        #endregion

        #region Metodos Publicos
        public static DataSet Listar()
        {
            return ServicioAutor.ListarPrivado(null, null, null, null);
        }

        public static DataSet Listar(String apellido)
        {
            return ServicioAutor.ListarPrivado(null, apellido, null, null);
        }

        public static DataSet Obtener(int idAutor, Guid guidAutor)
        {
            DataSet ds = new DataSet();
            ds.Locale = System.Globalization.CultureInfo.CurrentCulture;
            using (MySqlCommand cmd = UtilidadAD.CreateSqlCommand())
            {
                cmd.CommandText = "AutorTraer";

                SeteaValorNulo("p_activo", cmd, MySqlDbType.Bit);
                SeteaValorNulo("p_apellido", cmd, MySqlDbType.VarChar);
                if (idAutor != 0)
                {
                    cmd.Parameters.Add("p_IdAutor", MySqlDbType.Int32).Value = idAutor;
                }

                using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                {
                    da.Fill(ds);
                }
            }
            ds.Tables[0].TableName = ServicioAutor.DataTableName;

            return ds;
        }

        #endregion

        #region Metodos privados
        private static DataSet ListarPrivado(bool? activo, String apellido, String nombre, int? idAutor)
        {
            DataSet ds = new DataSet();
            ds.Locale = System.Globalization.CultureInfo.CurrentCulture;
            using (MySqlCommand cmd = UtilidadAD.CreateSqlCommand())
            {
                cmd.CommandText = "AutorTraer";
                if (activo != null)
                {
                    cmd.Parameters.Add("p_activo", MySqlDbType.Bit).Value = Convert.ToBoolean(activo, System.Globalization.CultureInfo.CurrentCulture);

                }
                else
                {
                    cmd.Parameters.Add("p_activo", MySqlDbType.Bit).Value = DBNull.Value;
                }
                if (apellido != "")
                {
                    cmd.Parameters.Add("p_apellido", MySqlDbType.VarChar, 100).Value = apellido;
                }
                else
                {
                    cmd.Parameters.Add("p_apellido", MySqlDbType.VarChar).Value = DBNull.Value;
                }
                if (idAutor != null)
                {
                    cmd.Parameters.Add("p_idAutor", MySqlDbType.Int32).Value = idAutor;
                }
                else
                {
                    cmd.Parameters.Add("p_idAutor", MySqlDbType.Int32).Value = DBNull.Value;
                }


                using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                {
                    da.Fill(ds);
                }
            }
            ds.Tables[0].TableName = ServicioAutor.DataTableName;
            return ds;
        }
        #endregion

        #region Metodos para Salvar
        public static int Salvar(Transaccion transaccion, int idAutor, String apellido, String nombre, String resumen,
            DateTime? fechaNacimiento, DateTime? fechaFallecimiento, int? idPaisNacimiento, string ciudadNacimiento, int? anioNacimiento,
            int? anioFallecimiento, int? idPaisNacionalidad, bool activo, bool esInsert)
        {
            if (transaccion == null)
            {
                throw new ArgumentNullException("transaccion");
            }
            using (MySqlCommand cmd = transaccion.SqlCommandObtener())
            {
                cmd.CommandText = "AutorSalvar";

                cmd.Parameters.Add("p_IdAutor", MySqlDbType.Int32).Value = idAutor;
                cmd.Parameters["p_IdAutor"].Direction = ParameterDirection.InputOutput;
                cmd.Parameters.Add("p_Nombre", MySqlDbType.VarChar).Value = nombre;
                cmd.Parameters.Add("p_Apellido", MySqlDbType.VarChar).Value = apellido;

                SetearConNulo("p_resumen", cmd, MySqlDbType.VarChar, resumen);
                SetearConNulo("p_anioNacimiento", cmd, MySqlDbType.Int32, anioNacimiento);
                SetearConNulo("p_fechaNacimiento", cmd, MySqlDbType.DateTime, fechaNacimiento);
                SetearConNulo("p_anioDefuncion", cmd, MySqlDbType.Int32, anioFallecimiento);
                SetearConNulo("p_fechaDefuncion", cmd, MySqlDbType.DateTime, fechaFallecimiento);
                SetearConNulo("p_idPaisNacimiento", cmd, MySqlDbType.Int32, idPaisNacimiento);
                SetearConNulo("p_ciudadNacimiento", cmd, MySqlDbType.VarChar, ciudadNacimiento);
                SetearConNulo("p_idPaisNacionalidad", cmd, MySqlDbType.Int32, idPaisNacionalidad);

                cmd.Parameters.Add("p_Activo", MySqlDbType.Bit).Value = activo;
                cmd.Parameters.Add("p_EsAlta", MySqlDbType.Bit).Value = esInsert;
                cmd.ExecuteNonQuery();
                return (Int32)cmd.Parameters["p_IdAutor"].Value;
            }
        }
        #endregion

        #region Metodos para eliminar
        public static bool Eliminar(Transaccion transaccion, Int32 idAutor)
        {
            if (transaccion == null)
            {
                throw new ArgumentNullException("transaccion");
            }
            using (MySqlCommand cmd = transaccion.SqlCommandObtener())
            {
                cmd.CommandText = "AutorEliminar";
                cmd.Parameters.Add("p_idAutor", MySqlDbType.Int32).Value = idAutor;
                return (Convert.ToInt32(cmd.ExecuteScalar().ToString(), System.Globalization.CultureInfo.CurrentCulture) > 0);
            }
        }
        #endregion
    }
}
